﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Colonisator.Classes
{
    /// <summary>
    /// Définit les spécificités d'une île.
    /// Une île étant un élément plateau, elle est directement aossicée à son port.
    /// </summary>
    public abstract class Ile : ElementPlateau
    {
        public string NomIle { get; set; }      

        /// <summary>
        /// A l'exception des îles neutres qui ne sont pas colonisables, chaque île
        /// peut être, à un moment, colonisable ou non.
        /// </summary>
        public bool EstIleColonisable { get; set; }

        /// <summary>
        /// Fournit le path way de tour l'île du sens horaire.
        /// Note : le point de départ et d'arrivée est le port
        /// </summary>
        public PathFinding ClockWiseRoundPath { get; set; }

        /// <summary>
        /// Fournit le path way de tour de l'île du sens rétrograde
        /// Note : le point de départ et d'arrivée est le port
        /// </summary>
        public PathFinding RetroWiseRoundPath { get; set; }

        /// <summary>
        /// Donne les éléments matériels et humains présents sur l'île
        /// </summary>
        public TableDeBord Presence { get; set; }

        /// <summary>
        /// Constucteur de début de partie.
        /// </summary>
        public Ile()
        {
            NomIle = "";
            EstIleColonisable = true;
            ClockWiseRoundPath = new PathFinding();
            RetroWiseRoundPath = new PathFinding();
            Presence = new TableDeBord();
        }

        public Ile(string unNom)
        {
            NomIle = unNom;
            ElementNavigable = true;
            ClockWiseRoundPath = new PathFinding();
            RetroWiseRoundPath = new PathFinding();
            Presence = new TableDeBord();
        }

        /// <summary>
        /// Retourne le Joueur possédant l'île, dont le nom est donné en paramètre.
        /// </summary>
        public T DonnerProprietaireIle<T>(string unNomIle) where T : Joueur
        {
            return (T)Partie.GetInstance().JoueursPartie.Find(x => x.Proprietes.Select(y => y.NomIle == unNomIle).First());
        }

        /// <summary>
        /// Donne une idée de la puissance offensive d'une île
        /// </summary>
        public double CalculerFortification()
        {
            throw new NotImplementedException();
        }
    }
}
